package com.xzj.admin.boot.service.impl;

import com.xzj.admin.boot.domain.entity.SysRoleMenu;
import com.xzj.admin.boot.domain.vo.SysRoleVO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import com.xzj.common.datasource.domain.PageReq;
import com.xzj.common.datasource.domain.PageResp;
import com.xzj.common.datasource.utils.XzjPageUtil;
import com.xzj.admin.boot.domain.entity.SysRole;
import com.xzj.admin.boot.mapper.SysRoleMapper;
import com.xzj.admin.boot.service.SysRoleService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @program: xzj-admin
 * @ClassName: SysRoleServiceImpl
 * @description: 角色;(sys_role)表服务实现类
 * @author: XiaZunJun
 * @create: 2024-7-30
 */
@Service
public class SysRoleServiceImpl implements SysRoleService{
    @Resource
    private SysRoleMapper sysRoleMapper;

    /**
     * 通过ID查询单条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    public SysRole queryById(long roleId){
        return sysRoleMapper.queryById(roleId);
    }

    /**
     * 分页查询
     *
     * @param pageReq 分页筛选条件对象
     * @return 查询结果
     */
    public PageResp<SysRoleVO> pageQuery(PageReq<SysRoleVO> pageReq){
        return XzjPageUtil.queryPage(pageReq, sysRole -> sysRoleMapper.queryAll(sysRole));
    }

    @Override
    public Map<String, String> roleMap() {
        List<SysRoleVO> sysRoleVOS = sysRoleMapper.queryAll(new SysRole());
        Map<String, String> result = new HashMap<>();
        sysRoleVOS.forEach(sysRole -> result.put(sysRole.getRoleId(), sysRole.getRoleName()));
        return result;
    }

    @Override
    public List<SysRole> queryAllRoleList(SysRole sysRole) {
        return sysRoleMapper.queryAllByLimit(sysRole);
    }

    /**
     * 新增数据
     *
     * @param sysRole 实例对象
     * @return 实例对象
     */
    public SysRoleVO insert(SysRoleVO sysRole){
        sysRoleMapper.insert(sysRole);
        roleMenuHandle(sysRole);
        return sysRole;
    }

    /**
     * 更新数据
     *
     * @param sysRole 实例对象
     * @return 实例对象
     */
    public SysRoleVO update(SysRoleVO sysRole){
        sysRoleMapper.update(sysRole);
        roleMenuHandle(sysRole);
        sysRoleMapper.deleteRoleMenu(sysRole.getRoleId(), sysRole.getMenuIds());
        return sysRole;
    }

    /**
     * 处理角色菜单关系的方法
     *
     * @param sysRole  系统角色对象
     */
    private void roleMenuHandle(SysRoleVO sysRole) {
        if (null != sysRole.getMenuIds() && !sysRole.getMenuIds().isEmpty()) {
            List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
            for (String menuId : sysRole.getMenuIds()) {
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setRoleId(sysRole.getRoleId());
                sysRoleMenu.setMenuId(menuId);
                sysRoleMenus.add(sysRoleMenu);
            }
            sysRoleMapper.roleMenuBatch(sysRoleMenus);
        }
    }

    /**
     * 通过主键删除数据
     *
     * @param roleId 主键
     * @return 是否成功
     */
    public boolean deleteById(long roleId){
        int total = sysRoleMapper.deleteById(roleId);
        return total > 0;
    }
}